// 引入axios库，axios是一个基于Promise的HTTP库，可以用在浏览器和node.js中  
import axios, { AxiosError } from "axios";
import router from "@/router";
// 引入axiosRequestConfig类型，这是axios请求的一些配置选项，如url、method、headers等  
import type { AxiosRequestConfig } from "axios";

// 引入element-plus库中的ElMessage模块，ElMessage是element UI库提供的一个用于显示消息的组件  
import { ElMessage } from "element-plus";

// 创建一个axios实例，这个实例会默认使用在后面的请求中  
export const httpInstance = axios.create()

// 定义一个类型BkResponest，这个类型有四个属性：data、code、message和succeed  
// data：存放返回的数据  
// code：返回的状态码  
// message：返回的消息文本  
// succeed：表示请求是否成功，true表示成功，false表示失败  
export type BkResponest = {
    data: any;
    code: number;
    msg: string;
    // succeed: boolean;
}

// 设置请求的根路径，通过VITE_BASEURL环境变量获取  
// VITE_BASEURL是一个在运行时设置的基础URL，可以在vite.config.js中配置  
httpInstance.defaults.baseURL = import.meta.env.VITE_BASEURL;

// 设置响应拦截器，拦截所有的axios请求的响应，可以在这里统一处理响应  
// 这里定义了一个异步函数$http，这个函数接受一个axios请求配置作为参数  
export const $http = async (config: AxiosRequestConfig) => {
    try {
        // 使用之前创建的axios实例发送请求，并等待响应  
        const axiosResponse = await httpInstance<BkResponest>(config);
        // 从响应中取出BkResponest类型的对象  
        const bkResponest = axiosResponse.data

        // 检查响应是否成功，如果失败则抛出一个错误，错误信息根据失败原因自定义  
        if (bkResponest.code === 0 && bkResponest.msg === 'NOT_LOGIN') {
            let errorTitle: string = 'Error'; // 定义错误标题的默认值为'Error'  
            // 如果响应的状态码是401，错误标题设为'Unauthorized'，并显示消息'Unauthorized'  
            // if (bkResponest.code === 401) {
            //     errorTitle = 'Unauthorized';
            //     ElMessage.error('Unauthorized')
            // }
            // 如果响应的状态码是403，错误标题设为'forbidden'  
            // else if (bkResponest.code === 403) {
            //     errorTitle = 'forbidden';
            // }
            // 如果响应的状态码是9999，错误标题设为'9999Error'  
            // else if (bkResponest.code === 9999) {
            //     errorTitle = '9999Error';
            // }
            // 如果响应的状态码是500，错误标题设为'ServerError'  
            // else if (bkResponest.code === 500) {
            //     errorTitle = 'ServerError';
            // }
            // 其他情况，错误标题设为'Unkown'  
            // else {
            //     errorTitle = 'Unkown';
            // }
            // 创建一个错误对象，错误信息为响应的message属性或者'Unkown'，错误名字为错误标题  

            // if (bkResponest.msg == "Network Error") {
            //     message = "后端接口连接异常";
            //   }
            //   else if (message.includes("timeout")) {
            //     message = "系统接口请求超时";
            //   }
            //   else if (message.includes("Request failed with status code")) {
            //     message = "系统接口" + message.substr(message.length - 3) + "异常";
            //   }
            console.log('用户为登录, 直接跳转至登录页面');
            router.replace('/login');
            const err = new Error(bkResponest?.msg || '没有登陆')
            err.name = errorTitle // 设置错误的名字为错误标题  
            throw err // 抛出这个错误对象  
        }
   
        return bkResponest;
    } catch (err) {
        if (err instanceof AxiosError) {
            ElMessage.error('网络错误')
        }  
        throw err; 
    }
}